package treeviewer;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;

public class ThirdChapter extends Shell {

	private static Text text;
	private static List list;
	private static Label benefitOfSwtLable;
	private static Group group;
	private static Button awtButton;
	private static Button swingButton;
	private static Button swtButton;
	private static Button button;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final Display display = Display.getDefault(); // ����Display����SWT����Ͳ���ϵͳ��������ġ�һ���߳��в���ͬʱ���������Display���ڡ�

		final Shell shell = new Shell(display); // ����һ�����ڶ���
		shell.setText("Hello SWT");
		shell.setSize(260, 283); // ���ô��ڳߴ�
		shell.open(); // �򿪴���

		// ����getPrimaryMonitorȡ��������������Ϣ�����ϵͳ�а�װ�˶��������������getMonitors�����õ�����
		Monitor monitor = display.getPrimaryMonitor();
		// ������������Ҫ�����߽�Ϳͻ������������֡��߽������������������棩����Ļ��С�����ͻ�������������������ʾ����
		// ����Ļ���ִ�С��һ����˵������ͼ�β���ϵͳ�����ϵ�������ռ����һ���ֿռ䣬�ͻ�����ĳߴ�ҪС�ڱ߽�ĳߴ�
		System.out.println(monitor.getClientArea());
		System.out.println(monitor.getBounds());

		text = new Text(shell, SWT.BORDER);
		text.setText("SWT��Eclipseƽ̨ʹ�õ�ͼ�ι�����");
		text.setBounds(10, 8, 230, 35);

		list = new List(shell, SWT.BORDER);
		list.setItems(new String[] { "ʹ�ò���ϵͳ���ؿؼ�", "�ṩһ��ƽ̨�޹ص�API", "GUI����������ٶȿ�", "�������......" });
		list.setBounds(10, 68, 232, 82);

		Color createdWhite = new Color(display, 255, 255, 255); // �Լ�����һ��Color���Լ������Color����ʱ��һ��Ҫ��������dispose�����ͷ���ռ�õ�ϵͳ��Դ
		Color systemBlack = display.getSystemColor(SWT.COLOR_BLACK); // ��Display��ȡ��һ��ϵͳColor������ȡ�õ�Colorʵ������ʹ����Ϻ�Ӧ�õ���dispose�����ͷ�
		// ������Ϊ��Щʵ�������������ط���ʹ�õ��������һ���ͷŵ�������ʹ�õ��ĵط����������Ҳ����ǰ���ᵽ��"˭����˭�ͷ�"ԭ����Ϊ����ֻ����ʹ�ö�û�й�����������ʹ�����Ҳ��Ӧ��ȥ�ͷ�

		@SuppressWarnings("unused")
		Font sysFont = display.getSystemFont();
		Font createdTahoma = new Font(display, "Tahoma", 10, SWT.BOLD);
		Font createdArial = new Font(display, "Arial", 12, SWT.ITALIC);
		benefitOfSwtLable = new Label(shell, SWT.NONE);
		benefitOfSwtLable.setText("SWT���ŵ㣺");
		benefitOfSwtLable.setBounds(10, 49, 90, 15);
		benefitOfSwtLable.setBackground(systemBlack); // ����ɫΪ��ɫ
		benefitOfSwtLable.setForeground(createdWhite); // ǰ��ɫΪ��ɫ
		benefitOfSwtLable.setFont(createdTahoma);

		group = new Group(shell, SWT.NONE);
		group.setText("��ʹ�ù���Щͼ�ι�����");
		group.setBounds(10, 159, 230, 47);

		awtButton = new Button(group, SWT.CHECK);
		awtButton.setText("AWT");
		awtButton.setBounds(10, 20, 54, 18);

		swingButton = new Button(group, SWT.CHECK);
		swingButton.setText("SWING");
		swingButton.setBounds(70, 22, 60, 15);

		swtButton = new Button(group, SWT.CHECK);
		swtButton.setText("SWT");
		swtButton.setBounds(136, 22, 62, 15);

		Image image = new Image(display, "D:\\fu.png");
		Image iconImage = display.getSystemImage(SWT.ICON_QUESTION);
		shell.setImage(iconImage);

		button = new Button(shell, SWT.NONE);
		button.setText("��һ�°�ť����SWT˵Hello");
		button.setBounds(10, 214, 227, 25);
		button.setImage(image);
		button.addSelectionListener(new SelectionListener() {

			@Override
			public void widgetSelected(SelectionEvent arg0) {
				// TODO Auto-generated method stub
				// ����һ���Ի���
				// MessageBox msgBox = new MessageBox(shell,
				// SWT.ICON_INFORMATION);
				// msgBox.setMessage("Hello SWT!");
				// msgBox.open();

				/**
				 * SWT���õ��߳�ģ�͹����ͼ������ֻ��UI�̲߳��ܽ��пؼ��ػ�ʹ����¼�ѭ����ֱ�ӷ���Display�Ĳ�����
				 * ��UI�߳���ͼֱ�Ӳ���Display��ᵼ��һ��SWT�쳣��
				 * 
				 */
				new Thread() {
					@Override
					public void run() {
						try {
							Thread.sleep(50000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						// ��̨�߳���Ҫ�������ʾ�ڽ�����ʱ������ͼ������UI�߳�ͬ������UI�߳����¼�ѭ����ִ����Щ����
						// Displayά����һ���Զ�����¼����У�������о�����������̨�̺߳�UI�߳�ͬ���ġ�
						// ��̨�߳�Runnable����ͼ������װ������Ȼ�󽫶�������¼������У�����Displayִ����Ϣѭ��ʱ�ͻ�ִ����Щ������
						// Display�ṩ������������������� �в����¼���display.syncExec(new
						// Runnable()��ͬ�����ã���display.asyncExec(new
						// Runnable()(�첽����)
						// ע�⣺������̨�߳�ʱ��ͨ���Ὣ��Ҫ��Runnable��run()�����з��ʵ�ͼ�ν���������ݹ�ȥ�������ڴ��뱻UI�߳�ִ��ʱ
						// �漰������п����Ѿ����ͷ��ˡ������Runnalbe����Ҫ�����õ��������״̬�����жϣ��Է�ֹ��������ѱ��ͷŵ�SWT�쳣��
						display.syncExec(new Runnable() {
							@Override
							public void run() {
								// TODO Auto-generated method stub
								if (button != null) {
									button.setText("Execution done");
								}
							}
						});
					}
				}.start();

			}

			@Override
			public void widgetDefaultSelected(SelectionEvent arg0) {
				// TODO Auto-generated method stub

			}

		});

		// ʹ��ϵͳ����
		Tray systemTray = display.getSystemTray();
		TrayItem newItem = new TrayItem(systemTray, SWT.NONE); // ����һ��TrayItem����������ͼ�����ʾ����
		newItem.setImage(display.getSystemImage(SWT.ICON_ERROR));
		newItem.setToolTipText("Test Tray!");

		final Menu menu = new Menu(shell, SWT.POP_UP); // ����һ���������˵���Ĳ˵�
		MenuItem item1 = new MenuItem(menu, SWT.PUSH);
		item1.setText("Menu Item 1");
		MenuItem item2 = new MenuItem(menu, SWT.PUSH);
		item2.setText("Menu Item 2");

		newItem.addListener(SWT.MenuDetect, new Listener() {

			@Override
			public void handleEvent(Event event) {
				// TODO Auto-generated method stub
				menu.setVisible(true);
			}
		});

		shell.layout(); // ���ִ���

		// �ؼ��ͷ�
		// button.dispose():����ť�ؼ��ͷŵ���
		// �ؼ�Ҳ��ռ��ϵͳ��Դ���ⲿ����Դ�ķ������ڿؼ��Ĺ��캯������ɵġ���һ���ؼ���dispose���������ú�����ռ�е�ϵͳ��Դ��
		// �ͷ��ˣ���������ؼ�����Ӧ��Java������Ȼ���ڣ����UI�߳���ͼ������Ѿ����ͷŵĿؼ����в������ͻ�õ����ؼ��ѱ��ͷš����쳣
		// ����ֶ��ͷſؼ��ᵼ��һϵ�е����⣬��������򲻵��ѣ���ò�Ҫ�ֶ��ͷ�һ���ؼ�����Ӧ�ý���SWTϵͳ�Զ��ͷ����ǡ�

		// ÿ�������е���Ϣѭ������
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}

		// �Լ������Ķ���һ��Ҫ�ͷţ���ʹ��ϵͳ������ȥ�ͷ�
		createdWhite.dispose();
		display.dispose();
		image.dispose();
		createdArial.dispose();
		createdTahoma.dispose();
		newItem.dispose();
	}

	/**
	 * ������UI�̵߳ĳ���ʱ���Ƽ�ʹ�����´���������Displayʵ��
	 * 
	 * @return
	 */
	public static Display getThreadDisplay() {
		return Display.getCurrent() == null ? new Display() : Display.getCurrent();
	}
}